home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
EMULATOR
/
D64IMAGE
/
AssImage
/
c
/
AssImage
Wrap
Text File
|
1997-08-05
|
4KB
|
170 lines
#include <stdio.h>
#include <string.h>
#ifdef __riscos__
#include <kernel.h>
#endif
#define MAX_TRACKS 35
#define IMAGE_SIZE 174848
#define OUTSTR stdout
char Image[IMAGE_SIZE];
unsigned int Tracks[41] = {
0x15000000, 0x15001500, 0x15002A00, 0x15003F00,
0x15005400, 0x15006900, 0x15007E00, 0x15009300,
0x1500A800, 0x1500BD00, 0x1500D200, 0x1500E700,
0x1500FC00, 0x15011100, 0x15012600, 0x15013B00,
0x15015000, 0x13016500, 0x13017800, 0x13018B00,
0x13019E00, 0x1301B100, 0x1301C400, 0x1301D700,
0x1201EA00, 0x1201FC00, 0x12020E00, 0x12022000,
0x12023200, 0x12024400, 0x11025600, 0x11026700,
0x11027800, 0x11028900, 0x11029A00, 0x1102AB00,
0x1102BC00, 0x1102CD00, 0x1102DE00, 0x1102EF00,
0x00030000
};
int DiscOffset(int t, int s)
{
unsigned int h;
if ((t<=0) || (t>MAX_TRACKS)) {return(-1);}
h = Tracks[t-1];
if ((s<0) || (s>=(h>>24))) {return(-1);}
return((h&0xffffff)+(s<<8));
}
int FullBlock(FILE *fp, unsigned char *b)
{
fread((void*)b,1,256,fp); return(0);
}
int EmptyBlock(FILE *fp, unsigned char *b)
{
memset((void*)b,fgetc(fp),256); return(0);
}
int PackedBlock(FILE *fp, unsigned char *buff)
{
register int pack, size, h;
unsigned char *b = buff, *lim = b+256;
size = fgetc(fp); pack = fgetc(fp);
while (size-- > 0)
{
h = fgetc(fp);
if (h == pack)
{
h = fgetc(fp); memset((void*)b,fgetc(fp),h); b+=h; size-=2;
}
else
{
*b++ = h;
}
}
if (b > lim) {return(-2);}
return(0);
}
/* Assemble C64 disc-images in multipart-format (1!..., 2!...) */
int main(int argc, char *argv[])
{
int counter=2,h,s,files=0;
FILE *fp;
#ifdef __riscos__
_kernel_osfile_block block;
#endif
if (argc<3)
{
fprintf(OUTSTR,"Use: %s disc_image source0 [source1 ...]\n",argv[0]); return(0);
}
memset((void*)Image,0,IMAGE_SIZE);
while (counter<argc)
{
fprintf(OUTSTR,"%s: ",argv[counter]);
if ((fp = fopen(argv[counter],"rb")) == NULL)
{
fprintf(OUTSTR,"Can't open!\n");
}
else
{
h=0; files++;
if (counter==2)
{
if (fgetc(fp) != 0xfe) {h++;}
if (fgetc(fp) != 0x03) {h++;}
#ifdef FullMasterHeader
if (fgetc(fp) != 0xad) {h++;}
if (fgetc(fp) != 0xa0) {h++;}
#else
fgetc(fp); fgetc(fp);
#endif
if (h!=0)
{
fprintf(OUTSTR,"Bad master file!\n");
}
}
else
{
if (fgetc(fp) != 0x00) {h++;}
if (fgetc(fp) != 0x04) {h++;}
if (h!=0)
{
fprintf(OUTSTR,"Bad slave file!\n");
}
}
if (h==0)
{
while ((h = fgetc(fp)) != EOF)
{
s = fgetc(fp);
if ((s = DiscOffset(h&0x3f,s)) < 0)
{
fprintf(OUTSTR,"Illegal track or sector!\n");
}
else
{
switch (h&0xc0)
{
case 0x00: h = FullBlock(fp,Image+s); break;
case 0x40: h = EmptyBlock(fp,Image+s); break;
case 0x80: h = PackedBlock(fp,Image+s); break;
default: h = -1;
}
if (h!=0)
{
fprintf(OUTSTR,"Error (%d @ %ld)!\n",h,ftell(fp));
}
}
}
}
fprintf(OUTSTR,"\n");
fclose(fp);
}
counter++;
}
if (files!=0)
{
if ((fp = fopen(argv[1],"wb")) == NULL)
{
fprintf(OUTSTR,"Unable to save to file <%s>!\n",argv[1]); exit(0);
}
#ifdef __riscos__
block.load = 0x164; _kernel_osfile(18,argv[1],&block);
#endif
fwrite((void*)Image,1,IMAGE_SIZE,fp);
fclose(fp);
}
return(0);
}